package com.example.rabbitmq.starter.dao;

import com.example.rabbitmq.starter.entity.MQConfigInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * MQ配置信息数据访问接口
 */
@Transactional
@Repository
public interface MQConfigRepository extends JpaRepository<MQConfigInfo, String> {
    
    /**
     * 根据业务名称查询配置信息
     *
     * @param businessName 业务名称
     * @return 配置信息
     */
    MQConfigInfo findByBusinessName(String businessName);
    
    /**
     * 根据消息类型查询配置信息
     *
     * @param messageType 消息类型
     * @return 配置信息
     */
    MQConfigInfo findByMessageType(String messageType);
    
    /**
     * 查询所有启用的配置信息
     *
     * @return 启用的配置信息列表
     */
    List<MQConfigInfo> findByEnabledTrue();
    
    /**
     * 根据消息类型分页查询配置信息
     *
     * @param messageType 消息类型
     * @param pageable    分页参数
     * @return 分页结果
     */
    Page<MQConfigInfo> findByMessageType(String messageType, Pageable pageable);

    /**
     * 根据消息类型分页查询配置信息
     *
     * @param messageType 消息类型
     * @return 分页结果
     */
    List<MQConfigInfo> queryAllByMessageType(String messageType);

    /**
     * 根据启用状态分页查询配置信息
     *
     * @param enabled  启用状态
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<MQConfigInfo> findByEnabled(Boolean enabled, Pageable pageable);
    
    /**
     * 根据消息类型和启用状态分页查询配置信息
     *
     * @param messageType 消息类型
     * @param enabled     启用状态
     * @param pageable    分页参数
     * @return 分页结果
     */
    Page<MQConfigInfo> findByMessageTypeAndEnabled(String messageType, Boolean enabled, Pageable pageable);
    
    /**
     * 根据交换机名称查询配置信息
     *
     * @param exchangeName 交换机名称
     * @return 配置信息列表
     */
    List<MQConfigInfo> findByExchangeName(String exchangeName);
    
    /**
     * 根据交换机名称和交换机类型查询配置信息
     *
     * @param exchangeName 交换机名称
     * @param exchangeType 交换机类型
     * @return 配置信息列表
     */
    List<MQConfigInfo> findByExchangeNameAndExchangeType(String exchangeName, String exchangeType);
}